package com.shihb.chapter01base

object Scala06For {
  def main(args: Array[String]): Unit = {
    demo05()


  }

  /**
   * 1、for推导式演示
   */
  def demo01(): Unit = {
    //输出10句 hello
    val start = 1
    val end = 10
    /*
     * start 哪里开始
     * to|until 是关键字
     * end  哪里结束
     * start to end 前后闭合[]
     * start until end 左闭右开[)
     */
    for (i <- start to end) {
      println("hello to " + i)
    }
    for (i <- start until end + 1) {
      println("hello until " + i)
    }
  }

  def demo02(): Unit = {
    //for推导式也可以直接对集合进行遍历
    val list = List(1, 2, 3, 4)
    for (e <- list) {
      println("item=" + e)
    }
  }

  /**
   * 2、for循环控制
   */
  def demo03(): Unit = {
    // 1)循环守卫
    // 表达式成了进入循环体，不成立继续下一个（相当于continue）
    for (i <- 1 to 3 if i != 2) {
      println(i + "")
    }
    // 2)引入变量,用;分开
    for (i <- 1 to 3; j = i * 2) {
      println("j=" + j)
    }
    //()可以写成{}上面写法等价下面
    for {
      i <- 1 to 3
      j = i * 2} {
      println("j=" + j)
    }
    // 3)嵌套循环
    for (i <- 1 to 2; j <- 1 to 2) {
      println("i=" + i, "j=" + j)
    }
    // 4)循环返回值
    // val res= for(i <- 1 to 10) yield i 说明
    // 1、 对1 to 10进行遍历
    // 2、 yield i 将每次循环得到i放入集合vector中并返回res
    // 3、 yield i 中的i可以替换成其他代码块
    val res = for (i <- 1 to 10) yield i
    println(res)
    val res2 = for (i <- 1 to 10) yield {
      if (i % 2 == 0) {
        i
      } else {
        "不是偶数"
      }
    }
    println(res2)
    // 5)步长控制Range
    //def apply(start: Int, end: Int, step: Int): Range = new Range(start, end, step)
    for (i <- Range(1, 10, 2)) {
      println("range:" + i)
    }
    for (i <- 1 to 10 if i % 2 == 1) {
      println("守卫实现步长:" + i)
    }
  }

  /**
   * 3、while循环 dowhile 和java一样
   * while循环没有返回值，推荐使用for循环
   */
  def demo04(): Unit = {

    //定义循环变量
    var i = 0
    while (i < 10) { //循环条件
      // 循环体
      println("hell0 " + i)
      // 循环遍历迭代
      i += 1
    }
  }

  /**
   * 4、循环的中断
   * 去掉break 和continue
   * break() 实现break效果
   * 条件语句或循环守卫 实现continue效果
   */
  def demo05(): Unit = {
    import util.control.Breaks._
    //breakable是一个高阶函数，可以接收函数的函数（后面详解）
    /*
    def breakable(op: => Unit) {
      try {
        op
      } catch {
        case ex: BreakControl =>
          if (ex ne breakException) throw ex
      }
    }
    （1）op: => Unit 表示接收参数是一个没有输入,也没有返回值的函数
     (2) 即可以简单理解可以接收一段代码块
     (3) breakable对break()抛出的异常做了捕获处理
     (4) 当传入的是代码块，scala程序员讲()改成{}
    */
    breakable {
      for (i <- 0 to 10) {
        // scala使用break函数中断循环
        // def break(): Nothing = { throw breakException }
        if (i == 3) break()
        println(s"i=$i")
      }
    }
    println("ok")

  }

}
